package kgame5.k25d {
	import kgame5.k3d.core.obj3d.bound.AABB;
	import kgame5.k25d.core.Node25D;
	import kgame5.k25d.core.group.Group25D;
	import kgame5.k3d.core.math.Vector3D;
	import kgame5.kutil.T;

	/**
	 * @author max
	 * 2010-12-19
	 * 
	 * 25D工具
	 * 	 * 注意是右手坐标系
	 * 
	 * 			Y
	 * 			|   
	 * 			|  
	 * 			|  
	 * 			|
	 * 		   / \
	 *        /   \
	 *       /     \
	 *      Z        X
	 * 屏幕坐标使用
	 * _______X
	 * |   
	 * |  
	 * | 
	 * Y
	 */
	public class Util25D {
		public static const MAGIC:Number=Math.cos(Math.PI/6) * Math.SQRT2;//投影运算需要的
		
		
		//投影到的mc的远点是0,0点，x正方向向右，y正方向向下
		public static function worldToScreen(world:Vector3D,screen:Vector3D):void{
			var x:int=world.x;
			var y:int=-world.y;//注意负号表示游戏逻辑世界中的y是向上的，但是为了适用等角变换公式，变成了向下的
			var z:int=world.z;

			screen.x =x- z;
			screen.y = y*MAGIC+(x+ z)*0.5;
			screen.z=(x+z)*0.886-y*0.707;//depth
		}
		
		//screen的有效值是(x,y),得到的2维世界的投影只有(x,z)
		public static function screenToWorld(screenX:Number,screenY:Number,world:Vector3D):void{
			world.x =screenY+screenX/2;
			world.z=screenY-screenX/2;
		}
		
		//查找rayCast,queryPoint,queryCircle,queryRect
		//工具性的函数，不放在world25D里是为了让World25D显得更加干净(只关注自己的分内之事即可)
		//注意node 的hardVO的的远点是长方体的中心
		public static function queryPoint(v3d_p:Vector3D,node:Node25D,result:Array):void{
			T.p("queryPoint",v3d_p);
			if(node is Group25D){
				T.p("group",node);
				var group:Group25D=node as Group25D;
				for each(var child:Node25D in group.getChildren()){
					var pp:Vector3D=new Vector3D();
					Vector3D.SSub(v3d_p, node.spcVO.v3d_p, pp);
					
					queryPoint(pp,child,result);
				}
			}else{
				T.p("nogroup",node.spcVO.aabb);
				if(node.spcVO.HitTestAABB_Point(v3d_p)){
					T.p("!!");
					result.push(node);
				}
			}
		}
	}
}
